package leetcode.editor.cn;//给你一个字符串 s ，逐个翻转字符串中的所有 单词 。
//
// 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 
//
// 请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。 
//
// 说明： 
//
// 
// 输入字符串 s 可以在前面、后面或者单词间包含多余的空格。 
// 翻转后单词间应当仅用一个空格分隔。 
// 翻转后的字符串中不应包含额外的空格。 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：s = "the sky is blue"
//输出："blue is sky the"
// 
//
// 示例 2： 
//
// 
//输入：s = "  hello world  "
//输出："world hello"
//解释：输入字符串可以在前面或者后面包含多余的空格，但是翻转后的字符不能包括。
// 
//
// 示例 3： 
//
// 
//输入：s = "a good   example"
//输出："example good a"
//解释：如果两个单词间有多余的空格，将翻转后单词间的空格减少到只含一个。
// 
//
// 示例 4： 
//
// 
//输入：s = "  Bob    Loves  Alice   "
//输出："Alice Loves Bob"
// 
//
// 示例 5： 
//
// 
//输入：s = "Alice does not even like bob"
//输出："bob like even not does Alice"
// 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 104 
// s 包含英文大小写字母、数字和空格 ' ' 
// s 中 至少存在一个 单词 
// 
//
// 
// 
//
// 
//
// 进阶： 
//
// 
// 请尝试使用 O(1) 额外空间复杂度的原地解法。 
// 
// Related Topics 双指针 字符串 
// 👍 419 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
class Solution151 {
    //先翻转每个单词，再翻转整个字符串
    public String reverseWords(String s) {
        StringBuffer sb = new StringBuffer(s);
        //去除前后多余空格
        int l = 0, len = s.length(), r = len - 1, tmp;
        while (l < len && sb.charAt(l) == ' ') l++;
        while (l < len && sb.charAt(r) == ' ') r--;
        sb = new StringBuffer(sb.substring(l, r + 1));

        l = 0;

        while ((len = sb.length()) > l) {
            tmp = l;
            while (l < len && sb.charAt(l) != ' ') l++;
            //将单词翻转，然后替换
            sb.replace(tmp, l,
                    new StringBuffer(sb.substring(tmp, l)).reverse().toString());
            //去除多余空格
            if(l<len){
                tmp = l;
                while (l < len && sb.charAt(l) == ' ') l++;
                if (l - tmp > 1) sb.delete(tmp, l-1);//留一个空格
                l=tmp+1;
            }

        }
        sb.reverse();
        return sb.toString();
    }

    public String reverseWords01(String s) {
        StringBuffer left = new StringBuffer();
        StringBuffer right = new StringBuffer();
        StringBuffer tmp = new StringBuffer(s);
        int l, r;//双指针
        while (tmp.length() > 0) {
            //去除tmp前后多余空格
            l = 0;
            r = tmp.length() - 1;
            while (l <= r && tmp.charAt(l) == ' ') l++;
            while (l <= r && tmp.charAt(r) == ' ') r--;//"  " " a" "b "
            if (l > r) break;
            tmp = new StringBuffer(tmp.substring(l, r + 1));
            //翻转前后两个单词
            l = 0;
            r = tmp.length() - 1;
            //找到前面单词的结尾
            while (l <= r && tmp.charAt(l) != ' ') l++;//最终指向单词后面的空格或tmp.length()
            //找到后面单词的开始
            while (l <= r && tmp.charAt(r) != ' ') r--;//最终指向单词前面的空格或l-1
            //前后存在两个不同单词，交换
            if (l <= r) {
                left.append(tmp.substring(r + 1, tmp.length()) + ' ');
                right.insert(0, ' ' + tmp.substring(0, l));
                tmp = new StringBuffer(tmp.substring(l, r));
            } else {
                left.append(tmp.toString() + ' ');
                break;
            }

        }
        return left.substring(0, left.length() - 1) + right.toString();
    }
}
//leetcode submit region end(Prohibit modification and deletion)
